# object method/static method/class method
class Person:
    type = 'human'

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def show_person(self):  # 对象方法会用到self
        print('{} is {} years old'.format(self.name, self.age))

    # 如果一个方法没有用到实例对象的任何属性，可以定义为static方法
    @staticmethod
    def demo():
        print('staticmethod')

    # 如果一个方法只用到了类属性，则定义为类方法
    # 类方法自动传参，无需手动传参
    # cls is Person
    @classmethod
    def test(cls):
        print(cls.type)


p1 = Person('tom', 18)
# 类的对象方法的调用方式
# 1.object.方法(参数列表)
print(p1.show_person())
# 2.class.方法(object, 参数列表)
print(Person.show_person(p1))
# 类的静态方法的调用
print(p1.demo())
print(Person.demo())
# 类方法的调用
p1.test()
Person.test()
